package com.zjm.behavioral.template_method.demo02;

public abstract class SoyMilk {

    /**
     * 模板方法
     * <p>
     * final不让子类去覆盖
     */
    final void make() {
        select();
        if (customerWantCondiments()) {
            addCondiments();
        }
        soak();
        beat();
    }

    /**
     * 选材料
     */
    void select() {
        System.out.println("第一步：选择好的新鲜黄豆");
    }

    /**
     * 添加不同的配料，抽象方法，子类具体实现
     */
    abstract void addCondiments();

    /**
     * 浸泡
     */
    void soak() {
        System.out.println("第三步：黄豆和配料开始浸泡，需要3小时");
    }

    /**
     * 打碎
     */
    void beat() {
        System.out.println("第四步：黄豆和配料放到豆浆机打碎");
    }

    /**
     * 钩子方法
     *
     * @return
     */
    boolean customerWantCondiments() {
        return true;
    }
}
